/*
* 判断子序列规则：
* 给定两个字符串 s 和 t，判断s是否是t的子序列
* s:abc
* t:aabbcc
* 定义：字符串s是字符串t在进行部分数据的删减之后，可以得到的，即abc可以由aabbcc删减掉a、b、c之后得到abc
*
* */

function isSubsequence(s,t){ //前者s是子 后者t是父
    let indexS = 0 //s字符串中每个字符的下标索引
    let lengthS = s.length //预存一下，省的一次次访问
    let lengthT = t.length //同理
    if(!lengthS){ //如果子序列为空
        return true //直接返回true
    }
    //比较s和t的字符是否一一相等，只要第一个不相等就判断不是子序列，如果第一个相等，才在此基础上比较其余的，直到遍历完s的所有字符
    for(let j = 0; j < lengthT; j++){ //j表示下标
        if(s[indexS] === t[j]){ //如果s字符串中的字符与t字符串中的字符相等
            indexS++ //如果第一个字符相等 s字符下标加加 用以下一次循环比较后面的字符
            if(indexS === lengthS){ //如果已经遍历到了s字符串的最后一位字符
                return true //说明每一位都是父字符串的一部分 返回true
            }
        }
    }
    return false //如果上面都不成立，则返回false
}

isSubsequence("abc","aabbcc")
isSubsequence("","abc")
isSubsequence("abc","abc")
isSubsequence("abca","abc")

//更优美的写法
function isisSubsequencePlus(s,t){
    let index = [0,0] //用数组形式 分别预存 s和t字符的下标索引初始值
    let lengthS = s.length //预存一下s字符的长度，省的一次次访问
    let lengthT = t.length //同理
    if(!lengthS){
        return true
    }
    while(index[0] < lengthS && index[1] < lengthT){ //当s字符还没遍历完并且t字符也没遍历完的时候
        if(s[index[0]] === t[index[1]]){ //字符串s的下标索引保存在数组index的第0位（[0]）字符串t的下标索引保存在数组index的第1位（[1]）
            //该判断说明两个字符相等，则各自的下标索引加加比较接下来的字符
            index[0]++ //字符s的下标索引增加
            index[1]++ //字符t的下标索引增加
        }else{ //否则就是字符t的索引往后挪寻找能与当前s字符索引所对应的字符相匹配的值
            index[1]++
        }
    }
    //如果没有走上面的循环，我们只需要判断s字符是否已经被遍历完，如果被遍历完还没找到相同的，则说明不是
    //return i[0] === s.length ? true : false
    return index[0] === s.length //这个写法更简洁优美
}
isisSubsequencePlus("abca","abc")
isisSubsequencePlus("ab","441b2c")
